﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

using Beeldbankmvc.Code;
using System.Collections;
using System.Net.Mail;

namespace Beeldbankmvc.Models
{
    public class UserRepository
    {
        BeeldbankLinqDataContext db = new BeeldbankLinqDataContext();

        public MembershipCreateStatus Add(RegisterModel model)
        {
            MembershipCreateStatus createStatus = MembershipCreateStatus.InvalidUserName;
            MembershipUser existingUser = Membership.GetUser(model.UserName);

            if (existingUser == null)
            {
                AccountMembershipService membershipService = new AccountMembershipService();                
                createStatus = membershipService.CreateUser(model.UserName, model.Password, model.Email);
                
                existingUser = Membership.GetUser(model.UserName);
                if (existingUser != null)
                {
                    existingUser.IsApproved = false;
                    Membership.UpdateUser(existingUser);

                    // Default role for new user is "Gebruiker"
                    Roles.AddUserToRole(model.UserName, "Gebruiker");

                    // Send email message to this user, to be able to verify the email 
                    // address belonging to this account
                    Notification.verifyNewAccount(existingUser);
                }
            }
            else
            {
                createStatus = MembershipCreateStatus.DuplicateUserName;
            }
            
            return createStatus;
        }

        public bool EditEnhancedAccountInfo(EditAccountModel model)
        {
            bool result = false;
            bool newUser = false;

            BEELDBANK_GEBRUIKER user;
            user = db.BEELDBANK_GEBRUIKERs.SingleOrDefault(m => m.UserId == model.UserId);
            if (user == null)
            {
                user = new BEELDBANK_GEBRUIKER();
                newUser = true;
            }

            MembershipUser currentUser = Membership.GetUser(model.UserId);
            if (currentUser != null)
            {
                currentUser.Email = model.Email;
                Membership.UpdateUser(currentUser);
            }

            user.UserId = model.UserId;
            user.Weergavenaam = model.FirstName + " " + model.LastName;
            user.Voornaam = model.FirstName;
            user.Tussenvoegsel = model.Prepositions;
            user.Achternaam = model.LastName;
            user.Aanhef = Convert.ToInt32(model.Header); // Add validation/exception handling
            user.Telefoonnummer = model.Phone;
            user.Adres = model.Address;
            user.Huisnummer = model.AddressNr;
            user.Postcode = model.ZipCode;
            user.Woonplaats = model.City;
            user.Land = Convert.ToInt32(model.Country); // Add validation/exception handling
            user.Bedrijfsnaam = model.CompanyName;
            user.FactuurAdres = model.FactuurAddress;
            user.FactuurHuisnummer = model.FactuurAddressNr;
            user.FactuurPostcode = model.FactuurZipCode;
            user.FactuurWoonplaats = model.FactuurCity;

            // Only set the delivery country when it's actually defined
            if (model.FactuurLand != null)
                user.FactuurLand = Convert.ToInt32(model.FactuurLand); // Add validation/exception handling

            if (newUser)
                db.BEELDBANK_GEBRUIKERs.InsertOnSubmit(user);
            else
                db.SubmitChanges();

            return result;
        }
        
        public bool EditEnhancedAccountInfo(EnhancedAccountModel model)
        {
            EditAccountModel newModel = new EditAccountModel();

            MembershipUser currentUser = Membership.GetUser(model.UserId);
            if(currentUser != null)
            {
                newModel.Email = currentUser.Email;

                newModel.Address = model.Address;
                newModel.AddressNr = model.AddressNr;
                newModel.City = model.City;
                newModel.CompanyName = model.CompanyName;
                newModel.Country = model.Country;
                newModel.FactuurAddress = model.FactuurAddress;
                newModel.FactuurAddressNr = model.FactuurAddressNr;
                newModel.FactuurCity = model.FactuurCity;
                newModel.FactuurLand = model.FactuurLand;
                newModel.FactuurZipCode = model.FactuurZipCode;
                newModel.FirstName = model.FirstName;
                newModel.Header = model.Header;
                newModel.LastName = model.LastName;
                newModel.Phone = model.Phone;
                newModel.Prepositions = model.Prepositions;
                newModel.UserId = model.UserId;
                newModel.ZipCode = model.ZipCode;
            }

            return this.EditEnhancedAccountInfo(newModel);
        }

        public EditAccountModel FindOne(Guid userId)
        {
            BEELDBANK_GEBRUIKER gebruiker = db.BEELDBANK_GEBRUIKERs.SingleOrDefault(m => m.UserId == userId);

            EditAccountModel model = null;
            
            if(gebruiker != null)
            {
                model = new EditAccountModel();
                model.UserId = gebruiker.UserId;
                model.FirstName = gebruiker.Voornaam;
                if (gebruiker.Tussenvoegsel != null)
                    model.Prepositions = gebruiker.Tussenvoegsel.Trim();
                else
                    model.Prepositions = gebruiker.Tussenvoegsel;
                model.LastName = gebruiker.Achternaam;
                model.Email = gebruiker.aspnet_User.aspnet_Membership.Email;
                model.Header = gebruiker.Aanhef.ToString();
                model.Phone = gebruiker.Telefoonnummer;
                model.Address = gebruiker.Adres;
                model.AddressNr = gebruiker.Huisnummer;
                model.ZipCode = gebruiker.Postcode;
                model.City = gebruiker.Woonplaats;
                model.Country = gebruiker.Land.ToString();
                model.CompanyName = gebruiker.Bedrijfsnaam;
                model.FactuurAddress = gebruiker.FactuurAdres;
                model.FactuurAddressNr = gebruiker.FactuurHuisnummer;
                model.FactuurZipCode = gebruiker.FactuurPostcode;
                model.FactuurCity = gebruiker.FactuurWoonplaats;
                model.FactuurLand = gebruiker.FactuurLand.ToString();
            }

            return model;
        }

        public IQueryable<BEELDBANK_GEBRUIKER> FindAll()
        {
            return db.BEELDBANK_GEBRUIKERs.OrderBy(p => p.Achternaam);
        }

        public Guid FindOnesGuidByName(String userName)
        {            
            BEELDBANK_GEBRUIKER gebruiker = db.BEELDBANK_GEBRUIKERs.SingleOrDefault(m => m.aspnet_User.UserName == userName);
            if (gebruiker != null)
            {
                return gebruiker.UserId;
            }
            else
            {
                Guid nullGuid = new Guid();
                return nullGuid;
            }
        }

        public String FindOnesEmailByName(Guid userName)
        {
            String retVal = "";
	        foreach(var orderRegel in db.BEELDBANK_GEBRUIKERs.Where(p => p.UserId == userName )) //BEELDBANK_ORDERREGELs.Where(p => p.OrderId == 13)) .Where(p => p.UserId == userGuid )
	        {
		        retVal = orderRegel.aspnet_User.aspnet_Membership.Email;
	        }

            return retVal;
        }


        public MailAddress FindOnesPublisherByName(Guid userName)
        {
            var workFlowUsers = db.BEELDBANK_REDACTEUR_BEHEERs.Where(p => p.Beheer.Equals(userName));
	
	        foreach(var user in workFlowUsers)
	        {
                MailAddress PublisherEmail = new MailAddress(user.aspnet_User.aspnet_Membership.LoweredEmail, user.aspnet_User.UserName);
                return PublisherEmail;
	        }

            return null;
        }
        
        public IEnumerable GetAllRolles()
        {
            string[] allRows = Roles.GetAllRoles();

            List<String> roles = new List<string>();
            roles.Add("Geen");

            string[] systemRoles = SystemRoles.getSystemRoles();

            foreach (string item in allRows)
            {
                if (!systemRoles.Contains(item))
                { 
                    roles.Add(item);
                }
            }

            IEnumerable<string> d = roles.Cast<string>();
            
            return d;
        }

        public void Save()
        {
            db.SubmitChanges();
        }
    }
}